/**
 * 针对一些大文件，使用流的方式进行读写操作  防止淹没可用内存
 *
 */

const fs = require('fs')
const path = require('path')

let buf = Buffer.alloc(3)
/**
 * 
 * @param {*} path  文件路径
 * @param {*} flags  操作方式 r 读  w写  a 追加   rw读写
 * @param {*} sys  权限  0o666 八进制 默认表示所有权限  
 * @param {*} cb  完成后的回调
 */
//====  读文件 写入buffer内存  读buffer内容  写进文件
fs.open(path.resolve(__dirname, 'node.md'), 'r', 0o666, function (err, fd) { // fd 文件描述符
    console.log(fd)
    fs.open(path.resolve(__dirname, 'copy.md'), 'w', function (err, wfd) {
        const onClose = () => {
            fs.close(fd, () => { })
            fs.close(wfd, () => { })
        }
        const next = () => {
            /**
                    * 
                    * @param {*} fd  文件操作符
                    * @param {*} buf   已声明的buf空间
                    * @param {*} 0 3 0  分别表示 从buf0开始写入  写入3个字符  从文件的第0个开始
                    * @param {*} cb  完成后的回调
                    */
            fs.read(fd, buf, 0, 3, 0, function (err, bytesRead) {  // bytesRead 实际读取到的个数 
                console.log('读取成功', bytesRead)
                if (!bytesRead) {
                    return onClose()
                }
                fs.write(wfd, buf, 0, 3, 0, function (err, bytesRead) {
                    console.log('写入成功', bytesRead)
                    next()
                })
            })
        }
        next()
    })
})

